package com.jintoufs.web.action.common;

import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.DomNodeList;
import com.gargoylesoftware.htmlunit.html.HtmlElement;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.jintoufs.domain.common.ChinaDate;

import java.io.IOException;
import java.net.MalformedURLException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

/**
 * Created by Zhao Kai on 2016/3/28.
 */
public class GetVacationName {

    private static String latestVocationName = "";

    public String getVocationName(DomNodeList<HtmlElement> htmlElements, String date) throws ParseException {
        String rst = "";

        boolean pastTimeFlag = false;
        DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
        Date paramDate = dateFormat.parse(date);
        if (new Date().getTime() >= paramDate.getTime()) {
            pastTimeFlag = true;
        }

        for (int i = 0; i < htmlElements.size(); i++) {
            HtmlElement element = htmlElements.get(i);
            if (element.getAttribute("class").indexOf("vacation") != -1) {

                boolean hitFlag = false;
                String vocationName = "";
                for (; i < htmlElements.size(); i++) {
                    HtmlElement elementTmp = htmlElements.get(i);
                    String liDate = elementTmp.getAttribute("date");

                    List<HtmlElement> lunar = elementTmp.getElementsByAttribute("span", "class", "lunar");
                    String lanarText = lunar.get(0).asText();

                    if (lanarText.equals("元旦")) {
                        vocationName = "元旦";
                    } else if (lanarText.equals("除夕") || lanarText.equals("春节")) {
                        vocationName = "春节";
                    } else if (lanarText.equals("清明")) {
                        vocationName = "清明";
                    } else if (lanarText.equals("国际劳动节")) {
                        vocationName = "国际劳动节";
                    } else if (lanarText.equals("端午节")) {
                        vocationName = "端午节";
                    } else if (lanarText.equals("中秋节")) {
                        vocationName = "中秋节";
                    } else if (lanarText.equals("国庆节")) {
                        vocationName = "国庆节";
                    }

                    if (liDate.equals(date)) {
                        hitFlag = true;
                    }

                    if (elementTmp.getAttribute("class").indexOf("vacation") == -1) {
                        break;
                    }
                }

                if (hitFlag == true && !vocationName.equals("")) {
                    rst = vocationName;
                    break;
                }

            } else {
                continue;
            }
        }

        if (rst.equals("")) {
            System.out.println("warning: fail to get vocation name from html page.");
            rst = latestVocationName;
        } else if (pastTimeFlag == true) {
            //更新《当前时间，且最近一次的可见的假期名
            latestVocationName = rst;
        }
        return rst;
    }


    public List<ChinaDate> getCurrentDateInfo() {
        WebClient webClient = null;
        List<ChinaDate> dateList = null;

        try {
            DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
            dateList = new ArrayList<ChinaDate>();

            webClient = new WebClient();
            HtmlPage page = webClient.getPage("http://hao.360.cn/rili/");

            //最大等待60秒
            for (int k = 0; k < 60; k++) {
                if (!page.getElementById("M-dates").asText().equals("")) break;
                Thread.sleep(1000);
            }

            //睡了8秒，等待页面加载完成...，有时候，页面可能获取不到，不稳定（）
            //Thread.sleep(8000);

            DomNodeList<HtmlElement> htmlElements = page.getElementById("M-dates").getElementsByTagName("li");
            for (HtmlElement element : htmlElements) {
                ChinaDate chinaDate = new ChinaDate();

                List<HtmlElement> lunar = element.getElementsByAttribute("span", "class", "lunar");
                List<HtmlElement> solar = element.getElementsByAttribute("div", "class", "solar");

                chinaDate.setLunar(lunar.get(0).asText());
                chinaDate.setSolar(solar.get(0).asText());
                chinaDate.setSolarDate(dateFormat.parse(element.getAttribute("date")));


                if (element.getAttribute("class").indexOf("vacation") != -1) {
                    chinaDate.setVacation(true);
                    chinaDate.setVacationName(this.getVocationName(htmlElements, element.getAttribute("date")));
                }

                if (element.getAttribute("class").indexOf("weekend") != -1 &&
                        element.getAttribute("class").indexOf("last") == -1) {
                    chinaDate.setSaturday(true);
                }
                if (element.getAttribute("class").indexOf("last weekend") != -1) {
                    chinaDate.setSunday(true);
                }
                if (element.getAttribute("class").indexOf("work") != -1) {
                    chinaDate.setWorkFlag(true);
                } else if (chinaDate.isSaturday() == false &&
                        chinaDate.isSunday() == false &&
                        chinaDate.isVacation() == false) {
                    chinaDate.setWorkFlag(true);
                } else {
                    chinaDate.setWorkFlag(false);
                }

                dateList.add(chinaDate);
            }


        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("get date from http://hao.360.cn/rili/ error~");
        } finally {
            webClient.close();
        }
        return dateList;
    }


    public ChinaDate getTodayInfo(Date startTime) {
        List<ChinaDate> dateList = this.getCurrentDateInfo();
        DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
        for (ChinaDate date : dateList) {
            if (dateFormat.format(date.getSolarDate()).equals(dateFormat.format(startTime))) {
                return date;
            }
        }
        return new ChinaDate();
    }


    public static void main(String[] args) throws FailingHttpStatusCodeException, MalformedURLException, IOException, InterruptedException {
        Calendar c = Calendar.getInstance();
        c.set(Calendar.DATE, c.get(Calendar.DATE) + 1);
        c.set(Calendar.HOUR_OF_DAY, 9);
        c.set(Calendar.MINUTE, 0);
        c.set(Calendar.SECOND, 0);
        Date startTime = c.getTime();
        List<ChinaDate> dateList = new GetVacationName().getCurrentDateInfo();
        ChinaDate today = new GetVacationName().getTodayInfo(startTime);
        DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");

        System.out.println("本月详情：");
        for (ChinaDate date : dateList) {
            System.out.println(dateFormat.format(date.getSolarDate()) + " " + date.getVacationName());
        }

        System.out.println("------------------------------------------------------------------------");
        System.out.println("今日详情：");
        System.out.println("日期：" + today.getSolarDate());
        System.out.println("农历：" + today.getLunar());
        System.out.println("公历：" + today.getSolar());
        System.out.println("假期名：" + today.getVacationName());
        System.out.println("是否周六：" + today.isSaturday());
        System.out.println("是否周日：" + today.isSunday());
        System.out.println("是否休假：" + today.isVacation());
        System.out.println("是否工作日：" + today.isWorkFlag());

        System.out.println("已发生的最近一次假期:" + GetVacationName.latestVocationName);
    }

}